﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp1
{
    class Program
    {
        private static float Money;

        //     第一题：
        //一个考试管理系统，需要录入考生成绩，只能录入数字，否则会报类型转换异常。
        //请编写相关代码，
        //1、捕获FormatException异常，并打印输出“异常已处理；
        //2、捕获OverflowException异常，数值超出float范围的异常，并打印输出“异常已处理；
        //3、捕获一般异常Exception异常。
        //4、最终处理finally
        //录入成绩结束后，请输出，总学生数，总分数，平均分。
        static float money = 0;
        static void Main(string[] args)
        {
            while (true)
            {
                Console.WriteLine("请选择：1.考试管理\t2.金额管理\t3.退出系统");
                string c = Console.ReadLine();
                switch (c)
                {
                    case "1":
                        ScoreManage();
                        break;
                    case "2":
                        MoneyManage();
                        break;
                    case "3":
                        Console.WriteLine("再见");
                        return;
                    default:
                        Console.WriteLine("输入错误，请重新输入");
                        break;
                }
            }
        }

        private static void MoneyManage()
        {
            //第二题：

            //编写一个程序，用以接收用户输入的两个浮点型的数值，一个值表示用户想要存放在银行账户中的余额，另一个值表示用户想要从银行账户中提取的金额。
            //实现存取款功能，
            //用户功能选择：1、存款，2、取款
            //取款时：
            //当用户想要提取的金额大于余额时，请手动抛出一个ArgumentOutOfRangeException 参数超出范围的异常，异常信息可以写“取款金额大于余额，请重新输入”
            //，如此以确保取款金额始终不大于当前余额。
            //操作结束，打印输出余额是多少。
            //最后再添加catch一般异常 Exception，使得数据类型转换的异常也能被捕获到。
            while (true)
            {
                Console.WriteLine("请输入您的选择：1.存款\t2.取款\t3.退出系统");
                string choice = Console.ReadLine();
                switch (choice)
                {
                    case "1":
                        //Console.WriteLine("存款");
                        saveMoney();
                        break;
                    case "2":
                        //Console.WriteLine("取款");
                        getMoney();
                        break;
                    case "3":
                        Console.WriteLine("感谢您的使用金额管理系统，再见");
                        return;
                    default:
                        Console.WriteLine("输入错误，请重新输入");
                        break;
                }
            }
        }
        private static void getMoney()
        {
            float temp;
            while (true)
            {
                try
                {
                    Console.WriteLine("请输入您要提取的金额：");
                    temp = float.Parse(Console.ReadLine());
                    if (temp < 0)
                    {
                        Console.WriteLine("输入错误，请重新输入！");
                        continue;
                    }
                    else if (temp > money)
                    {
                        throw new ArgumentOutOfRangeException();
                    }
                }
                catch (ArgumentOutOfRangeException)
                {
                    Console.WriteLine("取款金额大于余额，请重新输入！");
                    continue;
                }
                catch (Exception)
                {
                    Console.WriteLine("输入错误，请重新输入！");
                    continue;
                }
                break;
            }
            money -= temp;
            Console.WriteLine($"取款成功，当前金额为{money}");
        }
        private static void saveMoney()
        {
            float temp;
            while (true)
            {
                Console.WriteLine("请输入存入的金额：");
                try
                {
                    temp = float.Parse(Console.ReadLine());
                    continue;
                }
                catch (FormatException)
                {
                    Console.WriteLine("输入错误，请重新输入！");
                    continue;
                }
                if (temp < 0)
                {
                    Console.WriteLine("输入错误，请重新输入！");
                    continue;
                }
                break;
            }
            money += temp;
            Console.WriteLine($"存入成功，当前总金额为{money}");
        }

            private static void ScoreManage()
            {
                Console.WriteLine("欢迎进入图书管理系统，图图将为您服务！");
                Dictionary<string, float> a = new Dictionary<string, float>();      //定义键值
                float realScore = 0;
                string Num;

                while (true)
                {
                    while (true)
                    {
                        Console.WriteLine("请输入您的学号：");
                        Num = Console.ReadLine();
                        if (a.ContainsKey(Num))
                        {
                            Console.WriteLine("该学号已存在噢！请重新输入！");
                            continue;
                        }
                        break;
                    }
                    try
                    {
                        Console.WriteLine("请输入学生分数：");
                        realScore = float.Parse(Console.ReadLine());
                    }
                    catch (FormatException e)
                    {

                        Console.WriteLine("类型转化异常，异常已处理");
                        Console.WriteLine(e.Message);
                        Console.WriteLine(e.Source);
                        Console.WriteLine(e.StackTrace);
                    }
                    catch (OverflowException e)
                    {
                        Console.WriteLine("数值超出float范围，异常已处理");
                        Console.WriteLine(e.StackTrace);
                        Console.WriteLine(e.Source);
                        Console.WriteLine(e.Message);
                    }
                    catch (Exception e)
                    {
                        Console.WriteLine("异常已处理");
                        Console.WriteLine(e.StackTrace);
                        Console.WriteLine(e.Source);
                        Console.WriteLine(e.Message);
                    }
                    finally
                    {
                        Console.WriteLine("finally,最终已处理");
                    }
                    a.Add(Num, realScore);
                    Console.WriteLine("请继续输入,结束录入请输入0");
                    string b = Console.ReadLine();
                    if (b == "0")
                    {
                        break;
                    }
                }
                float Count = a.Count;
                float Sum = 0;
                foreach (var value in a.Values)
                {
                    Sum += value;
                }
                float Avg = Sum / Count;
                Console.WriteLine($"总学生数{Count},总分数{Sum},平均分{Avg}");
            }
        }
    }
